home *** CD-ROM | disk | FTP | other *** search
/ Utilities Professional 1-1500 / Utilities Professional 1-1500 (1994)(WPD)[!].iso / 12511500 / var1411.dms / var1411.adf / docs / LECasm.doc < prev    next >
Text File  |  1993-07-28  |  55KB  |  1,676 lines

  1.  
  2.          Chapter 2 : LECasm Macro Assembler V1.0
  3.         -----------------------------------------
  4.  
  5.   The assembler is not complete yet, see section 2.4.3 for a list of the
  6. directives not yet implemented. There will also be a vast number of bugs
  7. which I haven't found yet, which inevitably arise when writing programs of
  8. this length and complexity. One major thing is that I haven't done any checks
  9. for running out of workspace yet, so always make sure that you have plenty,
  10. otherwise the assembler will definitely crash.
  11.  
  12.   Assembly of the source code may be aborted by hitting CTRL + C. When the
  13. assembler next displays some text (an error), then it will abort the assembly
  14. process, with no output file being written.
  15.  
  16.   In the following chapter, if something is enclosed in square brackets ([,])
  17. then this means that the item is optional. Angled Brackets (<, >) represent
  18. a parameter that you should fill in. Anything else must be included.
  19.  
  20.  2.1    Invoking the Assembler from the CLI
  21. --------------------------------------------
  22.  Invoking the assembler from the editor has been dealt with in section 1.9.
  23.  
  24.  The assembler, LECasm, may also be run from the CLI. The format for calling
  25. it is as follows :
  26.  
  27.   LECasm [-<options>] <Source filename> [-<options>]
  28.  
  29.  The Source filename should be the name of the file containing the source
  30. code which you want to assemble. To add options, use a '-' sign, followed by
  31. a list of letter options, as follows :
  32.  
  33.  B - No output file will be produced
  34.  
  35.  C - Set Case independant labels ('help' is equivalent to 'Help')
  36.  
  37.  D - Add a symbol table to the output file (for Debugging)
  38.  
  39.  L - Specify that any output code should be linkable
  40.  
  41.  O<name> - Specify the output filename (name must be immediately after O)
  42.  
  43.  P<name> - Specify the program listing filename (must be immediately after P)
  44.      Selecting the name as * will send the listing output to the screen.
  45.      Selecting the name as PRT: will send the program listing to the printer.
  46.  
  47.  Q - Pause after assembling (Hit return at CLI, any key from editor)
  48.  
  49.  W<number> - Specify workspace size in bytes. This is the maximum assembled
  50.      size of the source code. The number has to be in decimal, and must
  51.      immediately follow the option.
  52.  
  53.  X - Add a symbol table to the output file, but only include the symbols
  54.      which have been XDEF'd
  55.  
  56.  !<ptr> - Used to link the editor to the assembler. ptr is a pointer to a
  57.      structure telling the assembler about the source code, and where to
  58.      output the list of errors. Shouldn't be used from the CLI
  59.  
  60.  The default method for assembly, is to have case sensitive labels, produce
  61. an executable file, with its filename based on the source filename, no
  62. listing, no symbol table production, no pausing after assembly, and a
  63. workspace of 60000 bytes. For example,
  64.  
  65.   LECasm -bq test.s
  66.  
  67. This assembles test.s, produces no binary output, and waits for return to
  68. be pressed after assembly
  69.  
  70.   LECasm -oTest test.s -dw30000
  71.  
  72. This assembles test.s, produces an executable binary file, with symbol table,
  73. under the name Test, and has a workspace of 30000 bytes
  74.  
  75.   LECasm -dw30000 test.s
  76.  
  77. This does exactly the same as the above command, but the assembler creates
  78. the output file name from the source filename. This is done via the
  79. following process :
  80.  
  81. 1) If an output file name is specified (via -o), then this is used
  82. 2) If the output file contains a period, followed by some letters, then the
  83.    last period and the letters following it are removed.
  84.    E.g. Test.s => Test     TEST.2.asm => TEST.2
  85. 3) If no period exists in the filename, then the letters '.exe' are added to
  86.    the filename, and this is used.
  87.    E.g. Test => Test.exe   TEST => TEST.exe
  88.  
  89.  
  90.  2.2    Source Code Format
  91. ---------------------------
  92.  The assembler expects each line of the source code to be formatted as
  93. follows :-
  94.  
  95. [<label>]    <opcode>    [<operand>[,<operand>]  [<comment>]
  96. loop        dbra        d0,loop        wait for a length of time
  97.  
  98. 2.2.1    Label Field
  99. --------------------
  100.   Each line does not need a label, and therefore this field can be omitted. A
  101. label must start at column one of the line, otherwise it will be treated as
  102. an opcode. It must start with a letter, a full stop, or an underline
  103. character The next character can be any letter, a digit, a full stop, or an
  104. underline character. A label ends with either a space, a tab, a carriage
  105. return, or a colon. Labels can be up to 230 characters in length. At the
  106. moment, all labels are case sensitive.
  107.   E.g. Some legal labels
  108.     test, TEST, test1, _test, Test.Me, _test.me.2
  109.  
  110.   E.g. Some illegal labels
  111.     1test, tes!t, VeryLongLabelIndeedWhichIsTooLarge
  112.  
  113.   There are some labels which you shouldn't use, and which will cause
  114. problems if you do :-
  115.   D0,D1..D6,D7    - May get confused with a data register
  116.   A0,A1..A7,SP    - May get confused with an address register
  117.   SR, CCR    - Status register, Condition Control Register,
  118.   USP        - User Stack Pointer
  119.  
  120.   __LEC        - Reserved label for identifying the assembler
  121.   __RS        - Reserved label which contains the value of the Reserve
  122.           Structure counter
  123.   NARG        - The number of arguments which were supplied to a macro
  124.  
  125. 2.2.1.1    Local Labels
  126. --------------------
  127.   Labels can be defined which are local to a certain section of code. A label
  128. is made local by starting it with a period (.). A local label is only valid
  129. between the previous non-local label, and the next non-local label. So for
  130. example :
  131.  
  132. Wait1    move.w    #100,d0            ;wait for a while
  133. .wait    dbra    d0,.wait
  134.     rts
  135.  
  136. Wait2    move.w    #200,d0            ;wait a bit longer
  137. .wait    dbra    d0,.wait
  138.     rts
  139.  
  140. Here, '.wait' is a local label. The first occurance is attached to subroutine
  141. Wait1, and the second occurance is attached to Wait2.
  142.  
  143.  
  144. 2.2.2    Opcode Field
  145. ---------------------
  146.   This field is separated from the label field by means of a tab, a space or
  147. a colon. Entries in this field are one of three types :-
  148. 1) A 68000 instruction
  149. 2) An assembler directive
  150. 3) Macro invocations
  151.  
  152.  Some opcodes can be followed by a size specifier. To size an opcode,
  153. directly after the instruction add a period character (.), and one of the
  154. following size specifiers :-
  155.  B - byte sized data (8 bits)
  156.  W - word sized data (16 bits)
  157.  L - long word sized data (32 bits)
  158.  S - short branch specifier
  159.  
  160.  If a size is not specified, then the assembler always assumes that the
  161. instruction is word sized, even if this is not allowed for that instruction.
  162.  
  163.  68000 instructions and assembler directives are case insensitive. Macro
  164. invocations are case sensitive.
  165.  
  166.  
  167. 2.2.3    Operand Field
  168. ----------------------
  169.   This is used by those instructions that need parameters. All modes apart
  170. from labels are case insensitive. For 68000 instructions, the following are
  171. recognised :-
  172.  
  173. Dn        -    Data Register Direct
  174. An        -    Address Register Direct
  175. (An)        -    Address Register Indirect
  176. (An)+        -    Address Register Indirect, with postincrement
  177. -(An)        -    Address Register Indirect, with predecrement
  178. d(An)        -    Address Register Indirect, with displacement
  179. d(An,Rn.S)    -    Address Register Indirect, with index
  180. d.S        -    Absolute short address (.S is equivalent to .W)
  181. d.L        -    Absolute long address (.L can be omitted)
  182. d(PC)        -    Program counter with displacement
  183. d(PC,Rn.S)    -    Program counter with index
  184. #d        -    Immediate
  185.  
  186. SR        -    Status Register (word sized)
  187. CCR        -    Condition Code Register (byte sized)
  188. USP        -    User Stack Pointer
  189. Rn/Rn/Rn/Rn
  190. or Rn/Rn-Rn/Rn    -    Register lists, used for the MOVEM instruction
  191.  
  192. n = Register number 0 to 7
  193. d = An expression
  194. R = Which register to use (A=address,D=data)
  195. S = Size of register to use (W or L)
  196.  
  197. In most circumstances, SP can be used as A7    (move.l sp,a0)
  198.  
  199.  
  200. 2.2.4    Comment Field
  201. ----------------------
  202.   A space following the Operand field is considered to start a comment. The
  203. Comment itself is totally ignored by the assembler, and should be there for
  204. your benefit. Also, a line starting with a '*', or a ';' is also treated to
  205. be a comment.
  206.  
  207.  
  208.  
  209. 2.3    Expressions
  210. --------------------
  211.   An expression is a rule for computing a value. It consists of one or more
  212. operands combined by means of an operator. For example :
  213.  
  214.    1+test*4
  215.  
  216. Here 1, test, 4 are operands, and +, * are the operators.
  217.  
  218.   Spaces in expressions are not allowed, and are treated by the assembler
  219. as the start of the comment field. All values used by the assembler are
  220. treated as signed long words, with no overflow checking being carried out.
  221.  
  222.  An operand may be one of the following :
  223.  
  224. 1) A constant value (E.g. 1, 4)
  225. 2) The current value of a label (E.g. test)
  226.  
  227.  The operators which the assembler recognises are as follows :
  228.  
  229. 1) Bitwise not (~)    E.g. ~%11010        = %111..11100101
  230. 2) Unary negate (-)    E.g. -%11010        = %111..11100110
  231. 3) Shift left (<<)    E.g. %11010<<3        = %11010000
  232. 4) Shift right (>>)    E.g. %11010>>3        = %11
  233. 5) Logic AND (&)    E.g. %11010&%11100    = %11000
  234. 6) Logic OR (!)        E.g. %11010!%11100    = %11110
  235. 7) Logic XOR (^)    E.g. %11010^%11100    = %00110
  236. 8) Multiply (*)        E.g. 400*17        = 6800
  237. 9) Integer Division (/) E.g. 400/17        = 23
  238. 10) Addition        E.g. 400+17        = 417
  239. 11) Subtraction        E.g. 400-17        = 383
  240. 12) Equality test    E.g. 400=17        = 0 (false)
  241. 13) Less than test    E.g. 400<17        = 0 (false)
  242. 14) Greater than test    E.g. 400>17        = -1 (true)
  243.  
  244.  
  245. 2.3.1    Constants
  246. ------------------
  247.   The constants of an expression may be in binary, octal, decimal,
  248. hexadecimal, or ascii characters. Binary numbers are specified by a '%' at
  249. the start of the number, octal by '@', hex by '$', and character constants by
  250. single quotes, or double quotes. Character constants must start and end with
  251. the same type of quotes. They are justified to the right, and any unused
  252. bytes are nulled. 
  253.  
  254.  For example:
  255.  
  256. 1) Binary Numbers,    E.g. %1101, %110101
  257. 2) Octal Numbers,    E.g. @15, @30071
  258. 3) Decimal Numbers,    E.g. 13, 12345
  259. 4) Hexadecimal Numbers,    E.g. $d, $3039
  260. 5) Character constants,    E.g. "A", '1234'
  261.  
  262.  
  263. 2.3.2    Labels
  264. ---------------
  265.  These are a collection of characters in the source code, which represent a
  266. number (either a constant or a relative address). They are used to clarify
  267. the source code, to make hunting for bugs and altering the code much easier.
  268. Predefined labels are as follows :
  269.  
  270. __LEC    - Contains the value 1, and is used for identifying this assembler
  271. __RS    - Contains the current value of the reserve structure counter
  272. NARGS    - The number of arguments present when calling a macro
  273. *    - The current value of the program counter (relative number)
  274.  
  275.  E.g. Suppose you are printing out some text where each page is 66 lines long
  276. You could use the number 66 throughout your code, but it is much clearer to
  277. use a constant,
  278.  
  279. Lines_Per_Page    EQU    66
  280.  
  281. Now say you want to use sheets of paper 70 lines long, then you only need to
  282. change this one constant, as opposed to changing every line which uses this
  283. constant.
  284.  
  285.  
  286. 2.3.3 Arithmetic precedence (highest first)
  287. --------------------------------------------
  288.   As with normal arithmetical expressions, the assembler recognises that each
  289. operator has a precedence. For example, * is more important (has a greater
  290. precedence) than + and hence a * operator is applied before a + operator, so
  291.  
  292.   1 + 2 * 3 has the value 7, and not 9
  293.  
  294. Precedence can be overcome by the use of brackets surrounding the section to
  295. be evaluated separately. So
  296.  
  297.   (1 + 2) * 3 has the value 9, and not 7
  298.  
  299.  Where operators have the same precedence, they are applied from left to right.
  300. Thus, since * and / have the same precedence
  301.  
  302.   12 / 2 * 3 has the value 18. not 2.
  303.  
  304.  
  305. There follows a list of operation precendences (highest first). Those
  306. operations on the same line have equal precedence.
  307.  
  308.     parentheses, bitwise not (~), unary negate (-)
  309.     Shift operations : left (<<), right (>>)
  310.     Logic operations : And (&), or (!), Xor (^)
  311.     Factors         : Multiply (*), Divide (/)
  312.     Simple Expression: Add (+), subtract (-)
  313.     Comparisons     : equality (=), less than (<), greater than (>)
  314.  
  315.  For the comparison operations, a result of 0 means that the comparison was
  316. FALSE. A result of -1 ($ffffffff) means that the comparison was TRUE.
  317.  
  318.  
  319. 2.3.4    Type Checking
  320. ----------------------
  321.   The result of an expression yields a value which is one of two different
  322. types. These are Absolute numbers and relative numbers.
  323.  
  324. 1) Absolute numbers are those which are known at assembly time.
  325.  E.g. 10, "help"
  326.  
  327. 2) Relative numbers are addresses of parts of your program which are only
  328. known when your program is executing. When a program is run, it may live in
  329. any area of the computers free memory, so references to parts of the program
  330. are stored as offsets relative to the start of the current section, along
  331. with a table of these offsets which are filled in when the program is run.
  332.  
  333.  E.g.
  334.  
  335. test    nop        ; test is a relative number, and its value is only
  336.             ; known when the program is running
  337.  
  338.  
  339.   To aid debugging, type checking is performed on the operands, when using
  340. certain operators. For example,
  341.  
  342. test    nop
  343.     move.l    #test+test,d0
  344.  
  345.  The last line will produce the error 'Illegal use of relative arithmetic',
  346. since it is complete nonsense to add two relative numbers together.
  347.     
  348.   There follows a table of all the type checking performed by the assembler
  349. for the various operators. The resulting type of the operation is given in
  350. the columns, with '--' meaning that an error will be displayed.
  351.  
  352.              +------------------------------+
  353.              |A op A|A op R |R op A |R op R |
  354.     +----------------+------+-------+-------+-------+
  355.     |Shift Operation | A    | --    | --    | --    |
  356.     |Logic Operation | A    | --    | --    | --    |
  357.     |Factors     | A    | --    | --    | --    |
  358.     |Addition     | A    | R    | R    | --    |
  359.     |Subtraction     | A    | --    | R    | A    |
  360.     +-----------------------------------------------+
  361.  
  362. A = Absolute number; R = Relative number
  363.  
  364.  
  365. 2.4.1    68000 instructions recognised
  366. --------------------------------------
  367.  The following opcodes are taken from the source code, and directly
  368. transfered into numbers which can then be executed by the processor. They can
  369. be entered in either upper or lower case.
  370.  
  371. ABCD
  372. ADD            - ADD is converted to ADDA, ADDI if needed
  373. ADDA,ADDI,ADDQ,ADDX
  374. AND            - AND is converted to ANDI if needed
  375. ANDI
  376. ASL,ASR
  377. BRA,BSR,BHI,BLS,BCC,BHS,BCS,BLO,BNE,BEQ,BVC,BVS,BPL,BMI,BGE,BLT,BGT,BLE,
  378.  - use bra.s, or bra.b for short branch (2 bytes long)
  379.  - use bra, bra.w, or bra.l for word branch (4 bytes long)
  380. BCHG
  381. BCLR
  382. BSET
  383. BTST
  384. CHK
  385. CLR
  386. CMP            - CMP is converted to CMPA, CMPI if needed
  387. CMPA,CMPI,CMPM
  388. DBT,DBF,DBRA,DBHI,DBLS,DBCC,DBHS,DBCS,DBLO,DBNE,DBEQ,DBVC,DBVS,DBPL,DBMI
  389. DBGEDBLT,DBGT,DBLE
  390. DIVS,DIVU
  391. EOR            - EOR is converted to EORI if needed
  392. EORI
  393. EXG            - EXG Ax,Dy is converted to EXG Dy,Ax
  394. EXT
  395. ILLEGAL
  396. JMP,JSR
  397. LEA
  398. LINK
  399. LSL,LSR
  400. MOVE             - MOVE is converted to MOVEA if needed
  401. MOVEA,MOVEM,MOVEP,MOVEQ
  402. MULS,MULU
  403. NBCD
  404. NEG,NEGX
  405. NOP
  406. NOT
  407. OR            - OR is converted to ORI if needed
  408. ORI
  409. PEA
  410. RESET
  411. ROL,ROR,ROXL,ROXR
  412. RTE
  413. RTR
  414. RTS
  415. SBCD
  416. ST,SF,SHI,SLS,SCC,SHS,SCS,SLO,SNE,SEQ,SVC,SVS,SPL,SMI,SGE,SLT,SGT,SLE
  417. STOP
  418. SUB            - SUB is converted to SUBA, SUBI if needed
  419. SUBA,SUBI,SUBQ,SUBX
  420. SWAP
  421. TAS
  422. TRAP
  423. TRAPV
  424. TST
  425. UNLK
  426.  
  427.  
  428. 2.4.2    Assembler directives
  429. -----------------------------
  430.   A directive is a command to the assembler to perform certain actions at
  431. assembly time. These can be commands to turn on or off program listing, or to
  432. include data directly into the object code. The directives can be in either
  433. upper or lower case, even though they are shown here in upper case. Some
  434. directives may be preceeded by a label, if a label is inappropriate for a
  435. directive, and you include one, then the assembler will just ignore it. There
  436. follows a list of possible directives, which are then explained more fully.
  437.  
  438. Assembly Control Directives
  439.     END        End of source code
  440.     FAIL        Produce an error
  441.     INCDIR        Set search path for files to be included
  442.     INCBIN        Include binary file
  443.     INCLUDE        Include source file to be assembled
  444.     OPT        Set assembler option
  445.     ORG        Start section for absolute code generation
  446.     SECTION        Starts a new program section
  447.  
  448. Conditional Assembly
  449.     CNOP        Conditional NOP for alignment
  450.     EVEN        Word align next instruction
  451.     ODD        Make sure next instruction isn't word aligned
  452.     IFEQ        Assemble if expression = 0
  453.     IFNE        Assemble if expression <> 0
  454.     IFGT        Assemble if expression > 0
  455.     IFGE        Assemble if expression >= 0
  456.     IFLT        Assemble if expression < 0
  457.     IFLE        Assemble if expression <= 0
  458.     IFC        Assemble if strings match
  459.     IFNC        Assemble if strings don't match
  460.     IFD        Assemble if symbol defined
  461.     IFND        Assemble if symbol not defined
  462.     ELSEIF        Switches assemby state
  463.  
  464. Data Definition
  465.     DC        Define constants
  466.     DCB        Define Constant Block
  467.     DS        Define storage
  468.  
  469. External Symbols
  470.     XDEF        Define symbols to export
  471.     XREF        Define symbols to be imported (relative)
  472.     XREF.L        Define symbols to be imported (absolute)
  473.  
  474. General Directives
  475.     IDNT        Change the unit name of a linkable object
  476.  
  477. Listing Control Directives
  478.     LIST        Enable listing
  479.     NOLIST        Disable listing
  480.     NOPAGE        Stop printing in pages
  481.     PAGE        Go to next listing page
  482.     SPC n        Skip n blank lines
  483.     LLEN n        Set line length (60<=n<=256)
  484.     PLEN n        Set page length (32<=n<=256)
  485.     TTL        Set program title
  486.     SUBTTL        Set program subtitle
  487.     LISTCHAR    Insert special characters
  488.  
  489. Macro Directives
  490.     MACRO        Start a macro definition
  491.     ENDM        End a macro definition
  492.     MEXIT        Exit from macro expansion
  493.  
  494. Repeat Loop Directives
  495.     REPT n        Begin repeat loop
  496.     ENDR        end repeat loop
  497.  
  498. Symbol Definition
  499.     =        Assign permanent value
  500.     EQU        Assign permanent value
  501.     SET        Assign temporary value
  502.     REG        Assign register list
  503.     EQUR        Assign register value
  504.     RS        Reserve structure space
  505.     RSRESET        Reset the structure offset
  506.     RSSET n        Set the structure offset to n
  507.  
  508.  
  509. Assembly Control Directives
  510. ----------------------------
  511. END    End of source code
  512. Format:    [<label>] END
  513.  
  514.   This directive tells the assembler that the source code has finished, and
  515. any subsequent text is ignored. If you want all of your source code to be
  516. assembled, then this directive can be omitted.
  517.  
  518. FAIL    Produce an error
  519. Format:    [<label>] FAIL
  520.  
  521.   This directive produces the error 'FAIL encountered'.
  522.  
  523.  
  524. INCDIR    Directories to search for files
  525. Format:        INCDIR <Search directory>[,<Search directory>]
  526.  
  527.   This directive defines a list of directories that should be searched for
  528. any INCLUDEd files. You can specify as many directories as you like, with
  529. each directory name being separated by a comma (,). The directory may be
  530. enclosed in single (') or double (") quotes. This directive must appear
  531. before any INCLUDE directives.
  532.  
  533.  
  534. INCLUDE      Include a source file to be assembled
  535. Format:    [<label>] INCLUDE <filename>
  536.  
  537.   This directive passes the assembly control to another file, assembles that,
  538. and then continues assembling the origional text. It is equivalent to
  539. inserting the named file in the source code at the position of the directive.
  540. Includes can be nested as many times as memory allows. It is especially
  541. useful for including a standard set of macro definitions, or EQUs in several
  542. different programs. The filename should be in standard amigados format, and
  543. can be enclosed in single (') or double quotes (").
  544.  
  545.  
  546. INCBIN    Include binary file
  547. Format:    [<label>] INCBIN <filename>
  548.  
  549.   This directive reads in the given file, and stores it directly into the
  550. output file. This is useful for including sound/graphics or any other type
  551. of data into your programs, using much less space and being quicker than
  552. using many DC directives. The start of the file is word aligned, as is the
  553. program counter after the file has been included
  554.  
  555.  
  556. OPT    Set assembler option
  557. Format:        OPT    <option>[,<option>]
  558.  
  559.   This allows control over various parts of the assembler. The option takes
  560. the form of a letter, or multiple letters, followed by a + or - to turn the
  561. option on and off respectively. The allowed options are as follows:
  562.  
  563. Option C - Case sensitivity                Default: OPT C+
  564.   OPT C+    Case sensitive labels
  565.   OPT C-    Case insensitive lables
  566.   This option allows program symbols to be either case sensitive, or case
  567. insensitive. This option should only used at the very beginning of the source
  568. file.
  569.  
  570. Option D - Include debugging information        Default: OPT D-
  571.   OPT D+    Include debugging information
  572.   OPT D-    Exclude debugging information
  573.   When an output file is produced by the assembler (executable or linkable),
  574. this option allows the inclusion of a symbol table consisting of all of the
  575. global relative symbols. This information is used by a symbolic debugger to
  576. make debugging of your programs simpler.
  577.  
  578. Option L - Linkable/executable output            Default OPT L-
  579.   OPT L+    Generate linkable code
  580.   OPT L-    Generate executable code
  581.   This option should only be used at the very start of the source code.
  582.  
  583. Option O - Optimisation                    Default OPT O-
  584.   OPT O+    Turn on all optimisations
  585.   OPT O-    Turn off all optimisations
  586.   LECasm is capable of improving certain statements to smaller, quicker
  587. versions. Any optimisations performed by the assembler are reported by
  588. warnings.
  589.   With optimisation on, all long backward branches within range will be
  590. converted to short branches. Also any long forward branches within range are
  591. reported with a warning.
  592.   After assembly, the number of optimisations performed, and the number of
  593. bytes saved are reported, if any were performed.
  594.  
  595. Option M - Include macro expansion in listing         Default OPT M-
  596.   OPT M+    Macro expansions will appear in listing
  597.   OPT M-    Macro expansions will not appear in listing
  598.   By surrounding parts of source code with this option, it is possible to
  599. selectively show the macro expansion in parts of your source.
  600.  
  601. Option P - Position independence checks            Default OPT P-
  602.   OPT P+    Enable position independent checks
  603.   OPT P-    Disable position independent checks
  604.   When this option is enabled, all code which requires the use of relocation 
  605. information is reported with an error.
  606.  
  607. Option S - Dump symbol table                Default OPT S-
  608.   OPT S+    Enable symbol dump
  609.   OPT S-    Disable symbol dump
  610.   With this option enabled, after assembly, the complete symbol table is
  611. dumped either to the screen, or to the program listing. Only the last use
  612. of this option is taken into account.
  613.  
  614. Option U - Underlines for local labels            Default OPT U-
  615.   OPT U+    Local labels begin with '_'
  616.   OPT U-    Local labels begin with '.'
  617.   This option allows local labels to begin with an underline instead of a
  618. dot. This option should only be used at the start of the source file.
  619.  
  620. Option W - Warnings                    Default OPT W+
  621.   OPT W+    Enable warnings
  622.   OPT W-    Disable warnings
  623.   This option allows the disabling of warnings which LECasm produces.
  624.  
  625. Option X - Export XDEF only                Default OPT X-
  626.   OPT X+    Export XDEF symbols
  627.   OPT X-    Export all relative symbols
  628.   This option is used in conjunction with option D+. When debugging
  629. information is included, this option allows only the symbols specifically
  630. defined with XDEF to be included in the symbol table.
  631.  
  632. For example,
  633.     OPT    d+,x+,o+
  634. enables a symbol to be produced in the output file, with on the symbols
  635. specified with XDEF to be included. All optimisations are also turned on.
  636.  
  637.  
  638. ORG    Start section for absolute code generation
  639. Format:     ORG <expression>
  640.  
  641.   This directive will set the program counter to the value of the expression,
  642. and start a new program SECTION which is position dependant. Programs written
  643. within and ORG section must be first loaded to that same address before the
  644. program will run correctly. So it is not advisable for you to run programs
  645. using this directive from AmigaDOS, as no relocation information is saved
  646. with the program. It is generally used for program which take over control of
  647. the whole machine, and ignore AmigaDOS completely.
  648.  
  649.   Each ORG directive causes a new AmigaDOS SECTION to be created, and it is
  650. up to you to split the assmblers output into the necessary parts.
  651.  
  652.  All labels within an ORG section are absolute, since arithmetic operations
  653. on these labels is valid, which is not the case for AmigaDOS sections. E.g
  654.  
  655.     ORG    $47050
  656. Screen    ds.b    $2710            ;Screen has value $47050
  657.  
  658. Copper    dc.w    $e0,Screen>>16        ;Load Bit plane via copper
  659.     dc.w    $e2,Screen&ffff        ;equivalent to dc.w $e0,$4,$e2,$7050
  660.  
  661.     **Rest of copper list**
  662.  
  663.  
  664. SECTION Start new program section
  665. Format:    [<label>] SECTION <name>[,<type>]
  666.  
  667.   This directives starts a new program section, or hunk. 
  668.  
  669. <name> is the section name (no spaces)
  670. <type> specifies the type of section, and is one of the following :-
  671.  
  672. CODE - Indicates that the next section contains relocatable code (default)
  673. DATA - Indicates that the next section contains initialised data
  674. BSS  - Indicates that the next section contains uninitialised data. In BSS
  675.        sections, you can only use the DS directive, to allocate storage space
  676.  
  677. The type can also be followed by an underscore and a letter to specify which
  678. area of memory the section will live in. These are :-
  679.  
  680. _F - put this section in FAST memory
  681. _C - put this section in CHIP memory
  682.  
  683.  The default place to store the section is in public memory.
  684.  
  685. E.g. CODE, DATA_F, BSS_C etc
  686.  
  687.  
  688. Conditional Assembly Directives
  689. --------------------------------
  690. CNOP    Conditional NOP for alignment
  691. Format: [<label>] CNOP    <offset>,<alignment>
  692.  
  693.   This directive aligns the program counter to the given alignment and offset
  694. relative to the start of the section. For standard amigados programs, only
  695. long word alignment can be guaranteed. For example, if you are using a File
  696. Info Block, to Examine a file using the dos library function, this needs to
  697. be long word aligned, so you should write something like the following:
  698.  
  699.         CNOP    0,4
  700. MyInfoBlock    ds.b    fib_SIZEOF    ;Allocate storage for info block
  701.  
  702.   Here MyInfoBlock would be long word aligned. The offset is added to the
  703. program counter after the alignment is made.
  704.  
  705.     CNOP    2,4
  706.  
  707.   This aligns any following code to the word boundary 2 bytes past the
  708. nearest long word aligned boundary.
  709.  
  710.  
  711. EVEN    word align next instruction
  712. Format: [<label>] EVEN
  713.  
  714.   This directive word aligns the next instruction. This is only necessary
  715. after using dc.b, or ds.b, followed by a label on a line with no directive,
  716. since all other commands automatically perform word alignment. For example
  717.     dc.b    1
  718. foo            ; foo has an odd address
  719. bar    nop        ; bar is word aligned by assembler
  720.  
  721. To word align foo, then put the EVEN directive before the foo label.
  722.  
  723.  
  724. ODD    Force non-word alignment
  725. Format:    [<label>] ODD
  726.  
  727.   This directive sets the program counter to the next odd address. It can
  728. be used to cause a bus error, for example
  729.  
  730.     ODD
  731. foo            ; foo has an odd address
  732. bar    nop        ; bar is word aligned by assembler
  733.  
  734.   Now branching to foo would cause a bus error
  735.  
  736.  
  737. IFEQ    Assemble if expression = 0
  738. IFNE    Assemble if expression <> 0
  739. IFGT    Assemble if expression > 0
  740. IFGE    Assemble if expression >= 0
  741. IFLT    Assemble if expression < 0
  742. IFLE    Assemble if expression <= 0
  743.  
  744. Format:        IFxx <expression>
  745.  
  746.   The IFxx range of directives can selectively compile parts of your code,
  747. while ignoring others, depending on the value of the operand. If the
  748. condition is true, then the code following this line is assembled, up to a
  749. matching ENDC. A false condition causes the assembler to skip past the next
  750. lines, until the matching ENDC is found. Conditional assembly can be nested
  751. as many times as you want. These directives are useful for inserting debug
  752. information during development. For example
  753.  
  754.     IFNE    DEBUG
  755.     opt    d+            include debugging info
  756.     bsr    DisplayDebugInfo
  757.     ENDC
  758.     IFEQ    DEBUG
  759.     bsr    DisplayNormalScreen
  760.     ENDC
  761.  
  762.  If DEBUG has the value 1, the first code fragment would be included, since
  763. 1 NE 0 is true. The second code fragment would not be included, since 1 EQ 0
  764. is false.
  765.  
  766.   If you have used high level languages, such as BASIC, C, PASCAL, etc, then
  767. the IF statement in these languages is equivalent to the IFNE directive, and
  768. can be used with the conditional operators as follows :
  769. (remember, a TRUE result gives -1, and a FALSE result gives 0)
  770.  
  771.     IFNE    Test=40
  772.       this code is assembled if Test has the value 40
  773.     ENDC
  774.  
  775.  
  776. IFC    Assemble if strings match
  777. Format:        IFC  '<string1>','<string2>'
  778.  
  779.   This directive compares the two strings, and assembles the following code
  780. up to the matching ENDC only if the strings are equal. If the strings are
  781. different, then the lines of code up to the matching ENDC are skipped. The
  782. two strings must be surrounded by single quotes ('), and are case sensitive.
  783.  
  784. IFNC    Assemble if strings don't match
  785. Format:        IFNC '<string1>','<string2>'
  786.  
  787.   This directive is the opposite of IFC, the following lines of code being
  788. assembled up the the matching ENDC only if the strings are different.
  789.  
  790.   The last two directives are only useful when using macros, for example you
  791. can check whether an operand has been supplied to a macro by the following:
  792.  
  793. MoveqD0    MACRO
  794.     IFC    '','\1'        ;if no operand for macro, assume 0
  795.     moveq    #0,d0
  796.     MEXIT
  797.     ENDC
  798.     moveq    #\1,d0        ;otherwise use operand
  799.     ENDM
  800.  
  801. Example uses :
  802.  
  803.     MoveqD0
  804.  The fact that there is no operand means that the conditional code is
  805. assembled, and the following code is produceed
  806.     moveq    #0,d0
  807.  
  808.  
  809.     MoveqD0    20
  810.  Since an operand has been supplied (20), so the the conditional is skipped,
  811. producing the following code :
  812.     moveq    #20,d0
  813.  
  814.  
  815. IFD    Assemble if symbol defined
  816. IFND    Assemble if symbol not defined
  817.  
  818. Format: IFD  <symbol name>
  819.     IFND <symbol name>
  820.  
  821.   These directives selectively assembles or skips the following code up to
  822. the matching ENDC, depending upon whether the symbol has previously been
  823. defined.
  824.  
  825.  
  826. ELSEIF    Switch assembly state
  827. Format:        ELSEIF
  828.  
  829.   This directive toggles the last conditional assembly command. This saves
  830. you from using an ENDC, followed by the opposite condition, so making the
  831. source code more readable. For example 
  832.  
  833.     IFEQ    test    is equivalent to    IFEQ    test
  834.         ....                    ....
  835.     ELSEIF                    ENDC
  836.         ....                IFNE    test
  837.     ENDC                        ....
  838.                         ENDC
  839.  
  840.  
  841. ENDC    End conditional Assembly
  842. Format:        ENDC
  843.  
  844.   This directive terminates the current level of conditional assembly.
  845.  
  846.  
  847. Data Definition Directives
  848. ---------------------------
  849. DC    Define constant
  850. Format:    [<label>] DC[.<size>]  <list>
  851.  
  852. <label>    DC.B    <expression>[,<expression>]
  853. <label>    DC.W    <expression>[,<expression>]
  854. <label>    DC.L    <expression>[,<expression>]
  855.  
  856.   This directive stores a list of constants into memory. The size of these
  857. constants is specified by the size specifier. Any number of constants can be
  858. stored, separated by commas (,). If no size specifier is given, word size is
  859. assumed. For byte sized constants, strings of ascii characters can also be
  860. stored as follows:
  861.     dc.b    "can't see the point "
  862.     dc.b    'of using "quotes"'
  863. Byte sized constants are not word aligned, whereas word and long word
  864. constants are. References to program labels can only be used in long word
  865. constant blocks, since labels are long words.
  866.  
  867.  
  868. DCB    Define constant block
  869. Format:    [<label>] DCB[.<size>]  <number>,<value>
  870.  
  871.   This directive stores the data item given in <value>, the number of times
  872. given by <number>. It is equivalent to having the following line, repeated
  873. <number> times
  874.     DC.<size>    <value>
  875.  
  876. For example, DC.W 10,test   is equivalent to typing:
  877.     DC.W    test,test,test,test,test,test,test,test,test,test
  878.  
  879.  
  880. DS    Reserve structure space
  881. Format:    [<label>] DS[.<size>]  <expression>
  882.  
  883. <label>    DS.B    <expression>
  884. <label>    DS.W    <expression>
  885. <label>    DS.L    <expression>
  886.  
  887.   This directive reserves memory locations for later use. All memory
  888. reserved using this directive is initialised to 0. The memory reserved with
  889. DS.B is not word aligned, whereas the memory for DS.W and DS.L are. The
  890. expression denotes the number of bytes, words or long words to reserve.
  891. Forward references to symbols cannot be used in the expression.
  892.  
  893.  
  894. INCLUDE      Include a source file to be assembled
  895. FORMAT:    [<label>] INCLUDE <file name>
  896.  
  897.   This directive passes the assembly control to another file, assembles that,
  898. and then continues assembling the origional text. Include directives can be
  899. nested as many times as memory allows. It is especially useful for including
  900. a standard set of macro definitions, or EQUs in several different programs.
  901.  
  902.  
  903.  
  904. External Symbols
  905. ----------------
  906.   It is useful to be able to selectively import and export symbols, so that
  907. different modules can use the same labels, but not have to bother about using
  908. local labels. These modules can be from a high level language. All that is
  909. then needed is to link the modules together, with the linker satisfying the
  910. references.
  911.   Both absolute and relative symbols can be imported and exported.
  912.  
  913. XDEF    Define an internal label as an external entry
  914. Format:        XDEF <label>[,<label>]
  915.  
  916.   Each label defined with the XDEF directive generates an external symbol
  917. definition. This list of symbols can be saved out with the output file when
  918. used in conjunction with the -X assembler option, or OPT X+.
  919.  
  920. XREF    Define a relative symbol defined in another linkable module
  921. XREF.L    Define an absolute symbol defined in another linkable module
  922. Format:        XREF    <label>[,<label>]
  923.         XREF.L    <label>[,<label>]
  924.  
  925.   These directives define a label which is defined in another program module.
  926. The values of the labels will be resolved later with a linker. The type of
  927. the imported label must be given, otherwise assembler errors will occur.
  928.   Only one import is allowed per expression, and must be of the form:
  929. import+<expression>, <expression>+import or import-<expression>
  930. any other forms of expression are illegal.
  931.  
  932. Note: when executable output is selected, the XREF directive is ignored,
  933. since the imported labels cannot be resolved with a linker, as executable
  934. code does not need to be passed through a linker.
  935.  
  936.  
  937. General Directives
  938. ------------------
  939. IDNT    Change the unit name of a linkable object
  940. Format:        IDNT    <string>
  941.  
  942.   A program unit consists of one of more sections. This must be given a name,
  943. which is by default ANON_MODULE. This name can be redefined using this
  944. directive. The name can only consist of the characters allowed for a label.
  945.  
  946.  
  947. Listing Control Directives
  948. --------------------------
  949.   When program listing is selected from the CLI (or editor), then the output
  950. consists of the following if it is a code producing line of source code
  951.     1 00.00000020+4e75                          RTS            end of function
  952. line   | Program | generated code    line of Source code
  953. number | counter |
  954.        |         |
  955.     Section  + appears
  956.     number   if macro
  957.      (hex)   expansion
  958.  
  959.   For a line where a value is produced, the following line is produced. This
  960. is for the EQU,SET,IFxx,RS directives.
  961.  
  962.     1=00000020                          StarX   rs.w    1
  963. line   Value of                         line of Source code
  964. number StarX
  965.  
  966.   The output is also formatted into pages. The first and last lines of a page
  967. are blank to prevent a line of listing spanning two pages of printer paper.
  968. It also constists of a three line title, which is as follows :
  969.  
  970. LECasm 68000 Macro Assembler V1.0      Page 1
  971. [Either source file assembling, or the name given with the TTL directive]
  972. [Blank, or the name given with the SUBTTL directive]
  973.  
  974.   If program listing is initiated from within the source code, then paging is
  975. disabled.
  976.  
  977.   As this assembler does not perform two full passes on the source code, the
  978. program listing is produced as the source code is being assembled. This means
  979. that when the listing is being produced, there will be some variables which
  980. have undefined values (they are defined later). When this happens, the value
  981. 0 is assumed for the listing.
  982.  
  983. LIST    Enable listing
  984. Format:        LIST
  985.         LIST    +
  986.         LIST    -
  987.   The LIST directive by itself will turn on the source code listing. You can
  988. achieve greater control over the listing by using the + and - options. The
  989. assembler maintains a counter, and if it is greater than or equal to zero,
  990. the listing is produced.
  991.     LIST    +    Increments the counter
  992.     LIST    -    Decements the counter
  993.     LIST        ;Sets the counter to 0
  994.  
  995.  
  996. NOLIST    Disable listing
  997. Format:        NOLIST
  998.   This directive sets the listing control counter to -1
  999.  
  1000.  
  1001. NOPAGE    Stop printing in pages
  1002. Format:        NOPAGE
  1003.   This directive stops the program listing being produced in pages.
  1004.  
  1005.  
  1006. PAGE    Go to next listing page
  1007. Format:        PAGE
  1008.   This sends return characters to the listing until the next page is reached
  1009.  
  1010.  
  1011. SPC n    Skip n blank lines
  1012. Format:        SPC    <expression>
  1013.   This will send the number of blank lines given in the expression to the
  1014. program listing
  1015.  
  1016.  
  1017. LLEN n    Set line length (60<=n<=256)
  1018. Format:        LLEN    <expression>
  1019.   This sets the width of a line of the program listing to the value of the
  1020. expression. This must be between 60 and 256
  1021.  
  1022.  
  1023. PLEN n    Set page length (32<=n<=256)
  1024. Format:        PLEN    <expression>
  1025.   This sets the Length of a page of the program listing to the value of the
  1026. expression. This must be between 32 and 256
  1027.  
  1028.  
  1029. TTL    Set program title
  1030. Format:        TTL    <name>
  1031.   This directive sets the title of the listing to the given name, for the
  1032. next page of program listing. The name may be enclosed in single or double
  1033. quotes.
  1034.  
  1035.  
  1036. SUBTTL    Set program subtitle
  1037. Format:        SUBTTL    <name>
  1038.   This directive sets the subtitle of the listing to the given name, for the
  1039. next page of program listing. The name may be enclosed in single or double
  1040. quotes.
  1041.  
  1042. LISTCHAR Insert special characters
  1043. Format:        LISTCHAR <expression>[,<expression>]
  1044.   This directive will send the character codes of the expressions to the
  1045. program listing. This is useful for setting up the printer to print in
  1046. draft mode, with condensed output etc.
  1047.  
  1048.  
  1049.  
  1050. Macro Directives
  1051. -----------------
  1052. MACRO    Start a macro definition
  1053. FORMAT:    <label> MACRO
  1054.  
  1055.   The macro directive marks the start of a macro definition, which is
  1056. terminated by the ENDM directive. The label must be provided, and is used
  1057. in place of a directive to invoke the macro expansion. The label must not
  1058. include the period (.) character. The source code after the macro directive
  1059. is skipped, and only included when the macro is invoked. Invoking the macro
  1060. causes the lines of source code after the macro directive to be included at
  1061. that point, up to either the end of the macro (marked by ENDM), or a
  1062. premature termination of the macro (with MEXIT). Macro definitions cannot
  1063. be nested. I.e. you cannot define a macro from within a macro, although you
  1064. can call a previously defined macro from within a macro.
  1065.   Macros are useful for storing sequences of instructions or directives that
  1066. are used frequently throughout the program, and replacing them with one line
  1067. of source code, which increases the programs readability.
  1068.  
  1069. ENDM    End a macro definition
  1070. FORMAT:        ENDM
  1071.  
  1072.   This directive marks the end of the current macro.
  1073.  
  1074. MEXIT    Exit from macro expansion
  1075. FORMAT:        MEXIT
  1076.  
  1077.   This directive prematurely terminates the expansion of the current macro.
  1078. It prevents you from having to use a conditional statement so that the
  1079. remainder of the macro up to the ENDM is skipped.
  1080.  
  1081. NARG    Reserved symbol
  1082.   This is not a directive, but a label which holds the current number of
  1083. arguments which come with the current macro invokation. Outside of a macro
  1084. expansion, NARG has the value 0.
  1085.  
  1086. Macro Invocation
  1087. -----------------
  1088.   A macro is called by putting the name of the macro in the opcode field of a
  1089. line of source code. The operand of the field contains a number of arguments,
  1090. separated by commas (,) which are passed onto the macro definition, for
  1091. inclusion. You are allowed up to 35 different arguments, which are accessed
  1092. in the macro itself by using the backslash character (\) followed by a number
  1093. or a letter to select the argument number (1..9,a..z).
  1094.  E.g \5 is argument 5, \A is argument 10, \S is argument 28
  1095.  
  1096.  If you want to use spaces, or commas within an argument, then you must
  1097. enclose the argument within angled brackets ( < and > ). If when using angled
  1098. brackets, you want to include a >, then you must do this by specifying >>.
  1099.  
  1100.  If a size specifier was supplied with the macro invokation, then this is
  1101. stored in parameter \0, and is one of the letters, B, W or L. If no size
  1102. specifier was supplied with the invokation, then \0 contains the letter W.
  1103. The final parameter usable in a macro is \@ which consists of an underscore
  1104. followed by a unique number for that macro. This is useful for defining
  1105. labels from within macros. Labels within macros without a unqiue number will
  1106. produce the 'Repeated Symbol' error.
  1107.  
  1108.  If you need to have a \ character in your macro definition, then this can be
  1109. achieved by typing \\.
  1110.  
  1111.  You can call any macro from within another macro, just so long as the macro
  1112. you are calling has previously been defined. You can thus have recursive
  1113. macros, where the macro calls itself. Macro calls may be nested as deeply as
  1114. the macro buffer allows.
  1115.  
  1116.   The macro buffer is a specific amount of memory set aside for the expansion
  1117. of macros. Increasing the buffer size allows you to use bigger macros, as
  1118. well as allowing for deeper recursion. The buffer is useful for trapping
  1119. recursive macros which have expanded uncontrollably.
  1120. For example:
  1121.  
  1122. Test    MACRO
  1123.     moveq    #0,d0
  1124.     Test
  1125.     ENDM
  1126.  
  1127.  This macro has no terminating condition, and will just harmlessly fill up
  1128. the macro buffer, before an error is reported.
  1129.  
  1130.  
  1131. Macro Example 1: Calling libraries
  1132.  
  1133.  When calling the system library functions, the usual approach is as follows:
  1134.  
  1135.     save the contents of register a6
  1136.     load a6 with the library base pointer
  1137.     JSR the routine, offsetting register a6
  1138.     restore the value of a6
  1139.  
  1140.  A compact method for doing the above job is via a macro, defined as follows:
  1141.  
  1142. LinkLib    MACRO
  1143.     move.l a6,-(sp)
  1144.     move.l    \2,a6        get library base
  1145.     jsr    _LV0\1(a6)    Call function
  1146.     move.l    (sp)+,a6
  1147.     ENDM
  1148.  
  1149.  Now say you want to allocate some memory using the exec function AllocMem.
  1150. The macro call would look as follows :
  1151.  
  1152.     LinkLib    AllocMem,ExecBase
  1153.  
  1154. The two arguments would then be transferred into the correct positions in the
  1155. macro's code, and line would be assembled as though it were :
  1156.  
  1157.     move.l    a6,-(sp)
  1158.     move.l    ExecBase,a6        get libaray base
  1159.     jsr    _LV0AllocMem(a6)    Call function
  1160.     move.l    (sp)+,a6
  1161.  
  1162.  
  1163. Macro example 2: Recursion
  1164.  
  1165.  Suppose you have written a routine called 'print', which displays a message
  1166. stored in a0. To write a message, you use the following :
  1167.  
  1168.     lea    Welcome_Message,a0
  1169.     bsr    print
  1170.  
  1171. You can write a macro which will print up to five messages out by using the
  1172. following recursive macro :
  1173.  
  1174. PrintMsg MACRO
  1175.      IFNC      '','\1'        ; check for paramter
  1176.      lea      \1,a0            ; display first parameter
  1177.      bsr      print
  1178.      PrintMsg \2,\3,\4,\5        ; call macro with next 4 parameters
  1179.      ENDC
  1180.      ENDM
  1181.  
  1182. If you invoke this macro with the following messages :
  1183.  
  1184.     PrintMsg Welcome_Message,More_Text
  1185.  
  1186. This macro call would be expanded as follows :
  1187.  
  1188.     IFNC     '','Welcome_Message'
  1189.     lea     Welcome_Message,a0
  1190.     bsr     print
  1191.     PrintMsg More_Text,,,,
  1192.       IFNC       '','More_Text'
  1193.       lea       More_Text,a0
  1194.       bsr       print
  1195.       PrintMsg ,,,,
  1196.         IFNC     '',''
  1197.         ENDC
  1198.         ENDM
  1199.       ENDC
  1200.       ENDM
  1201.     ENDC
  1202.     ENDM
  1203.  
  1204.   The above lines have been indented to show you the various levels of
  1205. recursion. 
  1206.  
  1207. Macro Example 3: General decremental counter
  1208.  
  1209.   The 68000 dbra instruction only decrements data registers of word length. A
  1210. more general instruction can be created using a macro, and the \0 parameter:
  1211.  
  1212. DBG    MACRO
  1213.     IFNE    NARG-2                ; check for 2 arguments
  1214.     FAIL    !! Wrong number of arguments !!
  1215.     MEXIT
  1216.     ENDC
  1217.     subq.\0    #1,\1
  1218.     bcc    \2
  1219.     ENDM
  1220.  
  1221.     DBG    d7,test
  1222.  
  1223.   This would be expanded to :
  1224.  
  1225.     IFNE    2-2                ; check for 2 arguments
  1226.     FAIL    !! Wrong number of arguments !!
  1227.     MEXIT
  1228.     ENDC
  1229.     subq.W    #1,d7
  1230.     bcc    test
  1231.     ENDM
  1232.  
  1233.   The conditional checks to see if two arguments were supplied. If this
  1234. wasn't the case, an error would be caused on the line containing the FAIL
  1235. instruction, which is printed out. The macro would then be prematurely
  1236. terminated by the MEXIT command, with assembly continuing after the macro
  1237. invokation.
  1238.   Since no size specifier was supplied, parameter \0 was assumed to be 'W'
  1239.  
  1240. test    DBG.l    d0,test
  1241.  
  1242.   This would produce the following assembled code :
  1243.  
  1244. test    subq.L    #1,d0
  1245.     bcc    test
  1246.  
  1247.   This use of the macro decrements resister d0 as a long word, and when equal
  1248. to $ffffffff, stops looping. This demonstrates the use of size specifiers
  1249. with macros.
  1250.  
  1251.  
  1252. Macro Example 4: Error handling
  1253.  
  1254.   The following macro is for use after a CMP instruction, and is useful for
  1255. error handling. If the result of the compare is not equal to zero, then no
  1256. error occured, and the program has to continue with the routine. If the
  1257. result is equal to zero, then a message is displayed, and then an error
  1258. handling routine is invoked. A macro can be used to achieve this as follows:
  1259.  
  1260. ErrIFEQ    MACRO
  1261.     bne.s    \@        ; if no error, skip past escape routine
  1262.     lea    \1,a0        ; otherwise display message & escape
  1263.     bsr    print
  1264.     bra    \2
  1265. \@
  1266.     ENDM
  1267.  
  1268.     jsr    _LV0Open(a6)        ; open a file using dos library
  1269.     cmp.l    #0,d0
  1270.     ErrIFEQ    NoFile,ErrorHandler
  1271.  
  1272.   This code fragment would get expanded to :
  1273.  
  1274.     jsr    _LV0Open(a6)        ; open a file using dos library
  1275.     cmp.l    #0,d0
  1276.     bne.s    _10        ; if no error, skip past escape routine
  1277.     lea    NoFile,a0        ; otherwise display message & escape
  1278.     bsr    print
  1279.     bra    ErrorHandler
  1280. _10
  1281.  
  1282.   The above code calls the dos library function Open, and if the file doesn't
  1283. exist prints a message before transferring control to the error handler. The
  1284. \@ parameter has been used to generate a unique label for that macro call, so
  1285. that it is possible to branch past the error handling code.
  1286.  
  1287.  
  1288.  
  1289.   Care must be taken when dealing with the arguments to the macro, otherwise
  1290. dangerous side effects may occur. For example, a squaring marco :
  1291.  
  1292. square    MACRO
  1293. \1    set    \1*\1
  1294.     ENDM
  1295.  
  1296. test    set    2        ; initialise value of test
  1297.  
  1298.     square    test
  1299.  
  1300.     square    test+1
  1301.  
  1302.  The first call of the macro works correctly, producing the line :
  1303. test    set    test*test
  1304.  
  1305.  The second call produces an incorrect result, producing the line:
  1306. test    set    test+1*test+1
  1307.  
  1308.  which is equivalent to 2*test + 1 which is not the same as squaring test.
  1309.  To solve this problem, the arguments in the macro definition, or the macro
  1310. call should have been enclosed in parenthesis. For example, here is the
  1311. corrected macro definition : 
  1312. square    MACRO
  1313. \1    set    (\1)*(\1)
  1314.     ENDM
  1315.  
  1316.   Used properly, macros can be an extremely useful tool in making your source
  1317. code both readable, and easily maintained.
  1318.  
  1319.  
  1320. Repeat Loop Directives
  1321. -----------------------
  1322. REPT     Begin repeat loop
  1323. Format:        REPT <number>
  1324.  
  1325.   This directive repeats the block of code surrounded by the REPT and ENDR
  1326. directives, the number of times specified by <number>. For example,
  1327.     moveq    #19,d0        Copy 20 long words from (a0)+ to (a1)+
  1328. loop    move.l    (a0)+,(a1)+
  1329.     dbra    d0,loop
  1330.  
  1331.  A faster version of this, eliminating the loop, and still being as readable
  1332. can be done with a loop :
  1333.     REPT 20
  1334.     move.l    (a0)+,(a1)+
  1335.     ENDR
  1336.  
  1337.   If you need labels within a loop, then they must be defined using macros,
  1338. to ensure that they are unique for each pass of the loop.
  1339.  
  1340.   The value of <number> MUST be greater than zero, and cannot contain forward
  1341. references to symbols.
  1342.  
  1343.  
  1344. ENDR    End repeat loop
  1345. Format:        ENDR
  1346.  
  1347.   This directive marks the end of the repeat loop.
  1348.  
  1349.  
  1350. Symbol Definition Directives
  1351. -----------------------------
  1352. =    Equate symnol value
  1353. Format:    <label>    =   <expression>
  1354.  
  1355. EQU    Equate symbol value
  1356. Format:    <label> EQU <expression>
  1357.  
  1358.   The EQU or = directive assigns the value of the expression in the operand
  1359. field to the symbol in the label field. The assignment is permanent, and so
  1360. you cannot use the label elsewhere in the program. The type of the expression
  1361. is given to the label. The expression must only contain previously defined
  1362. symbols.
  1363.  
  1364. REG    Assign register list
  1365. Format:    <label> REG <register list>
  1366.   The REG directive allows a symbol to be used in place of a register list,
  1367. used in conjunction with the MOVEM instruction. This is usually used to
  1368. ensure that registers to be pushed onto the stack at the start of a
  1369. subroutine are all popped off again on termination of the routine. E.g.
  1370.  
  1371. SubroutineRegs    REG    d2/d3/a4-a6
  1372.  
  1373. Subroutine
  1374.     movem.l    SubroutineRegs,-(sp)    ;save registers used by routine
  1375.  
  1376.     .... code for subroutine ....
  1377.  
  1378.     movem.l    (sp)+,SubroutineRegs    ;ensure only regs saved are restored
  1379.     rts
  1380.  
  1381. EQUR    Assign register value
  1382. Format: <label> EQUR <register>
  1383.   The EQUR directive allows a symbol to be used in place of a register. The
  1384. symbol must be defined before use, and its name cannot contain a period '.'
  1385. Only data registers and address registers are allowed. This is used to make
  1386. source code more legible. E.g.
  1387. Hardware    EQUR    a6
  1388. Colour00    EQU    $180
  1389.  
  1390.     lea    $dff000,Hardware
  1391.     move.w    #$fff,Colour00(Hardware)
  1392.  
  1393.  
  1394. SET    Set symbol value
  1395. Format:    <label> SET <expression>
  1396.  
  1397.   The EQU directive assigns the value of the expression in the operand field
  1398. to the symbol in the label field. This is identical to EQU, except that the
  1399. assignment is temporary. The expression must only contain previously defined
  1400. symbols.
  1401.  
  1402. RS    Reserve Structure Space
  1403. Format:    [<label>] RS[.<size>]  <expression>
  1404.  
  1405. <label>    RS.B    <expression>
  1406. <label>    RS.W    <expression>
  1407. <label>    RS.l    <expression>
  1408.  
  1409.   This directive is used to define 'C' type structures, as used extensively
  1410. by the Amiga Operating System. For example, a list of word numbers may be
  1411. defined as follows :-
  1412.  
  1413.     rsreset            ; reset Reserve counter
  1414. List_next    rs.l    1    ; pointer to next number in list
  1415. List_number    rs.w    1    ; The value of the number
  1416. List_SIZEOF    rs.w    0    ; The size of this structure
  1417.  
  1418. If you then allocated some memory for this structure, and used register A0
  1419. to point to this area of memory, then you can access the variouselements of
  1420. the structure, as follows :
  1421.     move.l    List_next(a0),a1    ; a1 points to next structure in list
  1422.     move.w    List_number(a0),d0    ; d0 = value of this number
  1423.  
  1424.   What this directive actually does is to assign the value of the internal
  1425. Reserve space counter to the label, and then increases the value of the
  1426. counter by the space allocated in the expression (like with DS). So in
  1427. our above example, List_next = 0, List_number = 4, List_SIZEOF = 6
  1428.   As with DC and DS, byte sized Reserves are not word aligned, whereas
  1429. word and long word reserves are.
  1430.  
  1431.  
  1432. RSRESET    Reset Structure Space counter
  1433. Format:        RSRESET
  1434.  
  1435.   This command sets the structure offset to zero
  1436.  
  1437.  
  1438. RSSET    Set Structure Space counter
  1439. Format:        RSSET <expression>
  1440.  
  1441.   This command sets the structure offset counter to the value of the
  1442. expression.
  1443.  
  1444.     RSSET    expression
  1445.  - This command sets the structure offset to the value of the expression. The
  1446.    numbers in the expression MUST be defined before the expression.
  1447.  
  1448.  
  1449. 2.4.3    Directives to be added
  1450. -------------------------------
  1451. Assembly control
  1452.     BSS        Start a BSS section
  1453.     CODE        Start a code section
  1454.     DATA        Start a data section
  1455.     OFFSET        Define offsets
  1456.     RORG        Relocatable origin
  1457.  
  1458.  
  1459.  
  1460. 2.5    Output file formats
  1461. ---------------------------
  1462.   LECasm can produce two different output file types, which are executable
  1463. and linkable.
  1464.  Executable output can be run directly from the CLI by typing its name or
  1465. double clicking its icon from workbench.
  1466.  Linkable output is used when writing larger programs, or when you wish to
  1467. link together some assembly code with that of a high level language. The
  1468. linker format used is the AmigaDOS standard, and standard linker programs
  1469. such as Blink can be used.
  1470.  
  1471.   Executable output is assumed. Linkable output can be forced by selecting
  1472. the -l option at the command line, or using OPT L+ at the very start if your
  1473. source code.
  1474.  
  1475.  
  1476. 3    Error messages
  1477. -----------------------
  1478.  
  1479. Addressing mode not allowed
  1480.     The addressing mode you have just tried to use is invalid. E.g.
  1481.     or.w    #20,a0
  1482.  
  1483. Bad Filename for program listing
  1484.     The assembler couldn't open a file for program listing
  1485.  
  1486. Bad register list
  1487.     Used for movem. Must be of form Dn-Dn/An-An, or Dx/Dy/Dz
  1488.  
  1489. Can't reserve relative amount of memory
  1490.      E.g.
  1491.     help    nop
  1492.         ds.b    help        ; nonsense
  1493.  
  1494. Cannot evaluate expression
  1495.     You've made a typo when entering an expression
  1496.      E.g.
  1497.     help    equ    10++10
  1498.  
  1499. Cannot nest repeat loops
  1500.  
  1501. Cannot SET relative label
  1502.      E.g.
  1503.     help    nop
  1504.     help    set    help+2        ; nonsense
  1505.  
  1506. Data too large
  1507.      E.g.
  1508.         moveq    #2048,d0
  1509.  
  1510. Data too small
  1511.      E.g.
  1512.         btst    #-1,d0
  1513.  
  1514. Division by zero
  1515.  
  1516. Expected comma
  1517.     extra characters were found after an operand, instead of a comma
  1518.  
  1519. FAIL encountered
  1520.     The FAIL, or a non-implemented directive was encountered
  1521.  
  1522. File not found
  1523.  
  1524. Forward reference or unknown variable
  1525.     used a variable before it was defined, or a type mismatch. E.g.
  1526.  
  1527.     ds.b    help
  1528. help    equ    10
  1529.  
  1530. Illegal branch
  1531.     Cannot branch short to next instruction. E.g.
  1532.         bra.s    help
  1533.     help    nop
  1534.  
  1535. Illegal Label
  1536.     Labels must start with a letter, '.' or '_'
  1537.  
  1538. Illegal use of relative arithmetic
  1539.      E.g.
  1540.     help    nop
  1541.     me    equ    help+help    ; nonsense
  1542.  
  1543. Instruction not recognised
  1544.     You've used a non-recognised directive (possible typing error ?)
  1545.  
  1546. Invalid directive for BSS section
  1547.     BSS sections can only reserve memory for use at run-time. So the
  1548.     only allowable code generating directive is 'ds'
  1549.  
  1550. Invalid string
  1551.     when using IFC or IFNC, the string of characters must be enclosed
  1552.     by single (') quotes
  1553.  
  1554. Line Length must be between 60 and 256
  1555.     The expression for LLEN must be between the above bounds
  1556.  
  1557. Macro used in expression
  1558.     A macro name was used in an arithmetic expression. For example
  1559.  
  1560. Test    MACRO
  1561.     moveq    #Test,d0    ;Test is a macro, not a number
  1562.     ENDM
  1563.  
  1564. Missing ENDC
  1565.     There are more IF's than ENDC's in the source
  1566.  
  1567. Missing ENDM
  1568.     There is a macro defintion without an end of macro directive
  1569.  
  1570. Missing ENDR
  1571.     There is a REPT in the source, without a matching ENDR
  1572.  
  1573. Missing Label
  1574.     EQU, MACRO, SET must have a label
  1575.  
  1576. Nested macro definition
  1577.     You cannot define a macro from within another macro
  1578.  
  1579. Out of macro space
  1580.     The macro buffer has become full, so increase it
  1581.  
  1582. Page Size must be between 32 and 256
  1583.     The expression for PLEN must be between the above bounds
  1584.  
  1585. Reading file
  1586.  
  1587. Register expected
  1588.     A register (Dn or An) must follow an EQUR statement. E.g.
  1589.     test    EQU    pc
  1590.  
  1591. Relative labels used in dc.b,dc.w  For example:
  1592.     test    nop
  1593.         dc.w    test    ;can't fit relative value of help into a word
  1594.  
  1595. Relative labels in different sections  For example:
  1596.     sect1    move.l    sect1-sect2,d0
  1597.         SECTION    two
  1598.     sect2    nop
  1599.  
  1600. Relative not allowed
  1601.     A relative label has been used with a word or byte size specifier
  1602.      E.g.
  1603.         move.w    #test,a0
  1604.     test    nop
  1605.  
  1606. Relative reference to different section
  1607.     You've tried to access a label in another section relative to the PC
  1608.      E.g.
  1609.         lea    test(pc),a0
  1610.         SECTION    Another
  1611.     test    nop
  1612.  
  1613. Relocation not allowed
  1614.     The message is for a line using a relocation, when using OPT P+.
  1615.     (position indendence checks)
  1616.  
  1617. Repeated Symbol <symbol>
  1618.     You've used this symbol before in the program
  1619.  
  1620. Size not allowed
  1621.     The size of your instruction is invalid for that instruction
  1622.      E.g.    move.b    #20,a0        ;address registers must be .w or .l
  1623.  
  1624. Spurious ELSEIF
  1625.     An ELSEIF directive was encountered outside of a conditional section
  1626.  
  1627. Spurious ENDC
  1628.     The ENDC directive was encountered outside of a conditional section
  1629.  
  1630. Spurious ENDM/MEXIT
  1631.     An end of MACRO directive was found when not expanding a macro
  1632.  
  1633. Spurious ENDR
  1634.     The ENDR directive was encountered before a REPT directive
  1635.  
  1636. Unknown addressing mode
  1637.     You have made a typing error while entering an addressing mode
  1638.  
  1639. Unknown section type
  1640.     Valid section types are: BSS, CODE, DATA
  1641.  
  1642. Unknown size
  1643.     The size you have used for an instruction is not recognised. E.g.
  1644.     move.z    #10,d0
  1645.  
  1646. Unknown symbol <label>
  1647.     You've used a label which you hasn't been defined
  1648.  
  1649. Unmatched parenthesis
  1650.     You've forgotten a bracket
  1651.  
  1652. Workspace too small (increase it)
  1653.     The size of the output from the assembler is greater than the space
  1654.     you have allocated. So you must increase the amount of workspace
  1655.     with -w from the CLI, or the workspace box from the editor
  1656.  
  1657.  
  1658. Credits
  1659. -------
  1660.  
  1661. A Practical Introduction to Pascal with BS 6192 - I.R. Wilson & A.M. Addyman
  1662.  - I used the syntax diagrams from this to make the Expression handler
  1663.  
  1664. Amiga ROM Kernal Reference Manual - Commodore-Amiga Inc.
  1665.  - Various bits
  1666.  
  1667. The AmigaDos Manual - Commodore-Amiga Inc.
  1668.  - Format for Amiga binary file structure, details about Assem
  1669.  
  1670. The Consise Atari ST 68000 Programmer's Reference Guide - Katherine Peel
  1671.  - I don't care what you say, the ST is a good computer, and anyway, this was
  1672.    the only book I have which outlined fully the 68000's instruction set. I
  1673.    never did get round to buying Motorola's book.
  1674.  
  1675.  
  1676.